package ld;

import ld.entity.LdO;
import ld.entity.LdObj;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 帮ld做表
 */
public class PoiLd {

    public static void main(String[] args) throws IOException {

        PoiLd poiLd = new PoiLd();
        List<LdObj> list = poiLd.readExcel();
        poiLd.makeData(list);
    }

    //生成word文档测试方法
    public void newWord(String title,String intro,String hire,String need,String edu,String link,String localder){

        String filePath = "D:\\work\\临时文件\\ld\\招聘信息\\1.docx";

        try (XWPFDocument document = new XWPFDocument()) {
            // 获取文档的 section 属性
            CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
            if (sectPr.isSetPgSz()) {
                sectPr.unsetPgSz(); // 如果已经设置了页面大小，则取消设置
            }
            // 设置页面大小为 A4
            CTPageSz pgSz = sectPr.addNewPgSz();
            pgSz.setW(BigInteger.valueOf(11906)); // A4 宽度，单位是 twips（1/1440 英寸）
            pgSz.setH(BigInteger.valueOf(16838)); // A4 高度，单位是 twips（1/1440 英寸）
            pgSz.setOrient(STPageOrientation.PORTRAIT); // 设置页面方向为纵向

            // 设置文档的默认段落样式
            CTDocument1 ctDocument = document.getDocument();
            CTBody ctBody = ctDocument.getBody();
            if (!ctBody.isSetSectPr()) {
                ctBody.addNewSectPr();
            }

            // 第一个段落：标题
            XWPFParagraph titleParagraph = document.createParagraph();
            titleParagraph.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun titleRun = titleParagraph.createRun();
            titleRun.setText(title);
            titleRun.setFontFamily("方正小标宋简体");
            titleRun.setFontSize(24); // 9.5号字体在POI中没有直接支持，使用9号字体
            titleRun.setBold(true);

            // 第二个段落：单位简介
            XWPFParagraph introParagraph = document.createParagraph();
            introParagraph.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun introRun = introParagraph.createRun();
            introRun.setText("单位简介");
            introRun.setFontFamily("方正小标宋简体");
            introRun.setFontSize(19);
            introRun.setBold(true);

            // 第三个段落：详细信息
            XWPFParagraph detailsParagraph = document.createParagraph();
            XWPFRun detailsRun = detailsParagraph.createRun();
            detailsRun.setText(intro);
            detailsRun.setFontFamily("方正小标宋简体");
            detailsRun.setFontSize(13);
            // 设置首行缩进
            int firstLineIndent = 24 * 20; // 假设每个字符大约占 20 DXA（这个值可能需要调整）
            detailsParagraph.setIndentationFirstLine(firstLineIndent);
            this.hangju(detailsParagraph);

            //第四个段落：招聘信息 单独标题
            XWPFParagraph hireParagraph = document.createParagraph();
            hireParagraph.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun hireRun = hireParagraph.createRun();
            hireRun.setText("招聘信息");
            hireRun.setFontFamily("方正小标宋简体");
            hireRun.setFontSize(19);
            hireRun.setBold(true);

            // todo 开始循环
            //第五个段落 单独的招人标题
            XWPFParagraph hireTitleParagraph = document.createParagraph();
            hireTitleParagraph.setAlignment(ParagraphAlignment.START);
            XWPFRun hireTitleRun = hireTitleParagraph.createRun();
            hireTitleRun.setText(hire);
            hireTitleRun.setFontFamily("方正小标宋简体");
            hireTitleRun.setFontSize(13);
            hireTitleRun.setBold(true);
            this.hangju(hireTitleParagraph);

            //第六个段落 需求
            XWPFParagraph needParagraph = document.createParagraph();
            needParagraph.setAlignment(ParagraphAlignment.START);
            XWPFRun needRun = needParagraph.createRun();
            needRun.setText(need);
            needRun.setFontFamily("方正小标宋简体");
            needRun.setFontSize(13);
            needRun.setBold(false);
            this.hangju(needParagraph);

            //第七个段落 学历
            XWPFParagraph educationalParagraph = document.createParagraph();
            educationalParagraph.setAlignment(ParagraphAlignment.START);
            XWPFRun educationalRun = educationalParagraph.createRun();
            educationalRun.setText(edu);
            educationalRun.setFontFamily("方正小标宋简体");
            educationalRun.setFontSize(13);
            educationalRun.setBold(false);
            this.hangju(educationalParagraph);

            //第八个段落 联系方式
            XWPFParagraph linkParagraph = document.createParagraph();
            linkParagraph.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun linkRun = linkParagraph.createRun();
            linkRun.setText("联系方式");
            linkRun.setFontFamily("方正小标宋简体");
            linkRun.setFontSize(19);
            linkRun.setBold(true);
            this.hangju(linkParagraph);

            //第九个段落 联系人
            XWPFParagraph lianxiParagraph = document.createParagraph();
            lianxiParagraph.setAlignment(ParagraphAlignment.START);
            XWPFRun lianxiRun = lianxiParagraph.createRun();
            lianxiRun.setText(link);
            lianxiRun.setFontFamily("方正小标宋简体");
            lianxiRun.setFontSize(13);
            lianxiRun.setBold(false);
            this.hangju(lianxiParagraph);

            //第八个段落 联系方式
            XWPFParagraph localParagraph = document.createParagraph();
            localParagraph.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun localRun = localParagraph.createRun();
            localRun.setText("联系地址");
            localRun.setFontFamily("方正小标宋简体");
            localRun.setFontSize(19);
            localRun.setBold(true);
            this.hangju(linkParagraph);

            //第十个段落 联系地址
            XWPFParagraph localDerParagraph = document.createParagraph();
            localDerParagraph.setAlignment(ParagraphAlignment.START);
            XWPFRun localDerRun = localDerParagraph.createRun();
            localDerRun.setText(localder);
            localRun.setFontFamily("方正小标宋简体");
            localDerRun.setFontSize(13);
            localDerRun.setBold(false);
            this.hangju(lianxiParagraph);

            // 保存文档
            try (FileOutputStream out = new FileOutputStream(filePath)) {
                document.write(out);
            }

            System.out.println("Word文档已成功生成：" + filePath);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //1.5行距
    public void hangju(XWPFParagraph paragraph){
        CTPPr pPr = paragraph.getCTPPr();
        if (pPr == null) {
            pPr = paragraph.getCTP().addNewPPr();
        }
        CTSpacing spacing = pPr.isSetSpacing() ? pPr.getSpacing() : pPr.addNewSpacing();
        spacing.setLineRule(STLineSpacingRule.AUTO); // 自动行距规则
        spacing.setLine(BigInteger.valueOf(360)); // 1.5 倍行距（1.5 * 240 = 360）
    }



    public List<LdObj> readExcel() throws IOException {

        ArrayList<LdObj> ldOList = new ArrayList<>();

        String inputFilePathA = "D:\\work\\临时文件\\ld\\海报草稿.xlsx";

        int sheetA = 0;

        // 加载A文件
        try (FileInputStream fis = new FileInputStream(inputFilePathA);
             Workbook workbook = new XSSFWorkbook(fis)) {
            // 获取sheet索引从0开始
            Sheet sheet = workbook.getSheetAt(sheetA);

            // 跳过表头开始遍历
            for (int rowIndex = 1; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
                Row row = sheet.getRow(rowIndex);
                if (row != null) {

                    Cell c_id = row.getCell(0, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    Cell c_title = row.getCell(2, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    Cell c_intro = row.getCell(4, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    Cell c_hire = row.getCell(5, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    //人数
                    Cell c_peNumb = row.getCell(6, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    String peopleNum = "";
                    if (c_peNumb != null) {
                        if (c_peNumb.getCellType() == CellType.NUMERIC) {
                            // 获取数值
                            double numericValue = c_peNumb.getNumericCellValue();

                            // 将数值转换为整数（注意：这可能会丢失小数部分）
                            int intValue = (int) Math.round(numericValue); // 使用Math.round来四舍五入，虽然对于整数来说这通常是多余的
                            // 或者，如果你确定数值总是没有小数部分，或者小数部分可以忽略，你也可以直接强制转换：
                            // int intValue = (int) numericValue; // 这可能会因为截断小数部分而导致不精确的结果，如果数值实际上是浮点数的话

                            // 将整数转换为字符串
                            String intValueAsString = Integer.toString(intValue);

                            peopleNum = intValueAsString;
                            // 或者，如果你在一个方法中，可以返回这个字符串
                            // return intValueAsString;
                        } else if (c_peNumb.getCellType() == CellType.STRING) {
                            // 如果单元格已经是字符串类型（尽管根据你的描述，这一列应该是数值类型）
                            // 直接输出或返回字符串
                            String stringValue = c_peNumb.getStringCellValue();
                            peopleNum = stringValue;
                        }
                    }

                    Cell c_need = row.getCell(7, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    Cell c_money = row.getCell(8, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    Cell c_edu = row.getCell(9, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    Cell c_link_name = row.getCell(10, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    //手机号
                    Cell c_link_mobile = row.getCell(11, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    String mobile = "";
                    if (c_link_mobile != null) {
                        if (c_link_mobile.getCellType() == CellType.NUMERIC) {
                            double numericValue = c_link_mobile.getNumericCellValue();
                            String cellValueAsString = Double.toString(numericValue);

                            // 检查字符串是否包含'E'，这表示科学计数法
                            if (cellValueAsString.contains("E")) {
                                // 这里处理科学计数法的情况
                                // 警告：一旦数字以科学计数法存储，可能无法准确恢复原始电话号码
                                // 一种可能的做法是尝试使用BigDecimal来减少精度损失
                                BigDecimal bigDecimalValue = new BigDecimal(Double.toString(numericValue));
                                String formattedPhoneNumber = bigDecimalValue.toPlainString();
                                mobile = formattedPhoneNumber;
                                // 但是，请注意，上面的toPlainString()方法仍;然可能不会给出有效的电话号码
                                // 因为原始数字可能已经被科学计数法改变
                                // 你可能需要进一步处理formattedPhoneNumber来得到正确的电话号码格式
                                // 这通常涉及到知道电话号码的确切长度和格式

                                // 输出格式化后的字符串（尽管它可能不是有效的电话号码）
//                                System.out.println(mobile);
                            } else {
                                // 如果不是科学计数法，直接输出字符串
                                mobile = cellValueAsString;
                            }
                        } else if (c_link_mobile.getCellType() == CellType.STRING) {
                            // 如果单元格已经是字符串类型，直接输出
                            mobile = c_link_mobile.getStringCellValue();
                        }
                        // 处理其他可能的单元格类型...
                    }

                    Cell c_link_email = row.getCell(12, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    Cell c_link_add = row.getCell(13, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);

                    LdObj obj = new LdObj();

                    obj.setId(c_id.toString());
                    obj.setTitle(c_title.toString());
                    obj.setIntro(c_intro.toString());
                    obj.setLink_name(c_link_name.toString());
                    obj.setLink_mobile(mobile);
                    obj.setLink_email(c_link_email.toString());
                    obj.setLink_add(c_link_add.toString());
                    obj.setHire(c_hire.toString());
                    obj.setPeNumb(peopleNum);
                    obj.setNeed(c_need.toString());
                    obj.setMoney(c_money.toString());
                    obj.setEdu(c_edu.toString());

                    ldOList.add(obj);
                    }
                }
            }

        return ldOList;
    }

    public void makeData(List<LdObj> ldObjList){

        // 使用Stream API根据id、title 和 intro 进行分组，并创建 ld.entity.LdO 实例
        Map<String, LdO> groupedById = ldObjList.stream()
                .collect(Collectors.toMap(
                        LdObj::getId, // keyMapper，使用id作为键
                        ldObj -> {
                            // valueMapper，创建一个新的LdO实例
                            // 由于id相同则name和intro也相同，我们可以直接使用第一个对象的name和intro
                            List<LdObj> sameIdList = ldObjList.stream()
                                    .filter(obj -> obj.getId().equals(ldObj.getId()))
                                    .collect(Collectors.toList());
                            return new LdO(ldObj.getId(), ldObj.getTitle(), ldObj.getIntro(), sameIdList);
                        },
                        (existing, replacement) -> existing
                ));

        groupedById.forEach((id, groupedLdObj) -> {


            try (XWPFDocument document = new XWPFDocument()) {
                String outPath = "D:\\work\\临时文件\\ld\\招聘信息\\";
                //#region
                // 获取文档的 section 属性
                CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
                if (sectPr.isSetPgSz()) {
                    sectPr.unsetPgSz(); // 如果已经设置了页面大小，则取消设置
                }
                // 设置页面大小为 A4
                CTPageSz pgSz = sectPr.addNewPgSz();
                pgSz.setW(BigInteger.valueOf(11906)); // A4 宽度，单位是 twips（1/1440 英寸）
                pgSz.setH(BigInteger.valueOf(16838)); // A4 高度，单位是 twips（1/1440 英寸）
                pgSz.setOrient(STPageOrientation.PORTRAIT); // 设置页面方向为纵向

                // 设置文档的默认段落样式
                CTDocument1 ctDocument = document.getDocument();
                CTBody ctBody = ctDocument.getBody();
                if (!ctBody.isSetSectPr()) {
                    ctBody.addNewSectPr();
                }
                //#endregion

                String title = groupedLdObj.getTitle();
                String intro = groupedLdObj.getIntro();
                String linkStr = "";
                String addrStr = "";

                // 第零个段落：编号
                String idStr = this.numbForm(id);
                XWPFParagraph numbParagraph = document.createParagraph();
                numbParagraph.setAlignment(ParagraphAlignment.RIGHT);
                XWPFRun numbRun = numbParagraph.createRun();
                numbRun.setText(idStr);
                numbRun.setFontFamily("方正小标宋简体");
                numbRun.setFontSize(17); // 9.5号字体在POI中没有直接支持，使用9号字体
                numbRun.setBold(true);

                // 第一个段落：标题
                XWPFParagraph titleParagraph = document.createParagraph();
                titleParagraph.setAlignment(ParagraphAlignment.CENTER);
                XWPFRun titleRun = titleParagraph.createRun();
                titleRun.setText(title);
                titleRun.setFontFamily("方正小标宋简体");
                titleRun.setFontSize(24); // 9.5号字体在POI中没有直接支持，使用9号字体
                titleRun.setBold(true);

                // 第二个段落：单位简介
                XWPFParagraph introParagraph = document.createParagraph();
                introParagraph.setAlignment(ParagraphAlignment.CENTER);
                XWPFRun introRun = introParagraph.createRun();
                introRun.setText("单位简介");
                introRun.setFontFamily("方正小标宋简体");
                introRun.setFontSize(19);
                introRun.setBold(true);

                // 第三个段落：详细信息
                XWPFParagraph detailsParagraph = document.createParagraph();
                XWPFRun detailsRun = detailsParagraph.createRun();
                detailsRun.setText(intro);
                detailsRun.setFontFamily("方正小标宋简体");
                detailsRun.setFontSize(13);
                // 设置首行缩进
                int firstLineIndent = 24 * 20; // 假设每个字符大约占 20 DXA（这个值可能需要调整）
                detailsParagraph.setIndentationFirstLine(firstLineIndent);
                this.hangju(detailsParagraph);


                //第四个段落：招聘信息 单独标题
                XWPFParagraph hireParagraph = document.createParagraph();
                hireParagraph.setAlignment(ParagraphAlignment.CENTER);
                XWPFRun hireRun = hireParagraph.createRun();
                hireRun.setText("招聘信息");
                hireRun.setFontFamily("方正小标宋简体");
                hireRun.setFontSize(19);
                hireRun.setBold(true);

                int index = 1;
                //开始循环
                List<LdObj> objList = groupedLdObj.getLdObjList();
                for (LdObj obj : objList) {


                    //招聘信息
                    String hireStr = index + ":" + obj.getHire() + "(" + obj.getPeNumb() + "人)";
                    //专业
                    String needStr = "需求专业:" + obj.getNeed() + " 薪资范围:" + obj.getMoney();
                    //学历
                    String eduStr  = "学历要求:" + obj.getEdu();

                    //第五个段落 单独的招人标题
                    XWPFParagraph hireTitleParagraph = document.createParagraph();
                    hireTitleParagraph.setAlignment(ParagraphAlignment.START);
                    XWPFRun hireTitleRun = hireTitleParagraph.createRun();
                    hireTitleRun.setText(hireStr);
                    hireTitleRun.setFontFamily("方正小标宋简体");
                    hireTitleRun.setFontSize(13);
                    hireTitleRun.setBold(true);
                    this.hangju(hireTitleParagraph);

                    //第六个段落 需求
                    XWPFParagraph needParagraph = document.createParagraph();
                    needParagraph.setAlignment(ParagraphAlignment.START);
                    XWPFRun needRun = needParagraph.createRun();
                    needRun.setText(needStr);
                    needRun.setFontFamily("方正小标宋简体");
                    needRun.setFontSize(13);
                    needRun.setBold(false);
                    this.hangju(needParagraph);

                    //第七个段落 学历
                    XWPFParagraph educationalParagraph = document.createParagraph();
                    educationalParagraph.setAlignment(ParagraphAlignment.START);
                    XWPFRun educationalRun = educationalParagraph.createRun();
                    educationalRun.setText(eduStr);
                    educationalRun.setFontFamily("方正小标宋简体");
                    educationalRun.setFontSize(13);
                    educationalRun.setBold(false);
                    this.hangju(educationalParagraph);


                    //联系人
                    linkStr = "联系人:" + obj.getLink_name() + " 联系电话:" + obj.getLink_mobile() + " 联系邮箱:" + obj.getLink_email();
                    //地址
                    addrStr = obj.getLink_add();


                    index++;
                }

                //第八个段落 联系方式
                XWPFParagraph linkParagraph = document.createParagraph();
                linkParagraph.setAlignment(ParagraphAlignment.CENTER);
                XWPFRun linkRun = linkParagraph.createRun();
                linkRun.setText("联系方式");
                linkRun.setFontFamily("方正小标宋简体");
                linkRun.setFontSize(19);
                linkRun.setBold(true);
                this.hangju(linkParagraph);

                //第九个段落 联系人
                XWPFParagraph lianxiParagraph = document.createParagraph();
                lianxiParagraph.setAlignment(ParagraphAlignment.START);
                XWPFRun lianxiRun = lianxiParagraph.createRun();
                lianxiRun.setText(linkStr);
                lianxiRun.setFontFamily("方正小标宋简体");
                lianxiRun.setFontSize(13);
                lianxiRun.setBold(false);
                this.hangju(lianxiParagraph);

                //第八个段落 联系方式
                XWPFParagraph localParagraph = document.createParagraph();
                localParagraph.setAlignment(ParagraphAlignment.CENTER);
                XWPFRun localRun = localParagraph.createRun();
                localRun.setText("联系地址");
                localRun.setFontFamily("方正小标宋简体");
                localRun.setFontSize(19);
                localRun.setBold(true);
                this.hangju(linkParagraph);

                //第十个段落 联系地址
                XWPFParagraph localDerParagraph = document.createParagraph();
                localDerParagraph.setAlignment(ParagraphAlignment.START);
                XWPFRun localDerRun = localDerParagraph.createRun();
                localDerRun.setText(addrStr);
                localDerRun.setFontFamily("方正小标宋简体");
                localDerRun.setFontSize(13);
                localDerRun.setBold(false);
                this.hangju(lianxiParagraph);

                outPath = outPath + id + ".docx";

                // 保存文档
                try (FileOutputStream out = new FileOutputStream(outPath)) {
                    document.write(out);
                }

                System.out.println("Word文档已成功生成：" + outPath);

            } catch (IOException e) {
                e.printStackTrace();
            }

        });
    }

    public String numbForm(String id){
        // 首先，尝试将字符串转换为浮点数（因为原始字符串是 "1.0" 这样的格式）
        double idDouble = Double.parseDouble(id);

        // 然后，将浮点数转换为整数（这里我们简单地取整，如果原始数据有小数部分，它会被截断）
        int idInt = (int) idDouble;

        // 最后，使用 String.format 方法将整数格式化为三位数的字符串
        // "%03d" 表示如果数字不足三位，则在前面补零
        return String.format("%03d", idInt);
    }

}
